package kded.demo.schedule;

import kd.bos.context.RequestContext;
import kd.bos.exception.KDBizException;
import kd.bos.exception.KDException;
import kd.bos.logging.Log;
import kd.bos.logging.LogFactory;
import kd.bos.schedule.executor.AbstractTask;

import java.util.HashMap;
import java.util.Map;

/**
 * 后台任务实现类，测试用
 * 关注点：
 * 1、AbstractTask 派生类不只是可以在，界面中进行配置调度，也可以通过后台代码调度
 * 2、参数获取、实时进度输出
 *
 * @author rd_johnnyding
 * @modifer caijiasheng
 * @remark
 *
 * 根据传入的循环执行次数，循环执行，每次循环输出当前进度
 */
public class MyTask extends AbstractTask {

    private static final Log log = LogFactory.getLog(MyTask.class);

    @Override
    public void execute(RequestContext rc, Map<String, Object> params) throws KDException {

        // 任务开始，输出当前进度及提示
        feedbackProgress(0, "已经进入任务执行环节，开始执行任务", null);

        // 从输入参数中，获取输入的循环次数 (默认20次)
        int time = 20;
        if (params.containsKey("time")) {
            time = (int)params.get("time");
        }
        if (time > 100 || time <= 0) {
            throw new KDBizException(String.format("设置的次数不合理，合理范围是[1,100]", time));
        }

        try {
            int progress = 0;
            for (int i = 0; i < time; i++) {

                // 反馈进度
                String desc = String.format("开始进行第  %s / %s 次循环", i+1, time);
                progress = (100 * i) / time;
                feedbackProgress(progress, desc, null);

                // 判断前端是否下达了终止任务的指令
                if (isStop()) {
                    stop();
                }

                // 执行业务逻辑，此处假设需要耗时500ms，暂停5000ms
                Thread.sleep(500);
            }
        } catch (InterruptedException e) {
            // 输出monitor日志
            log.error(e);
        }

        // 任务执行完毕，生成执行结果输出
        HashMap<String, Object> result = new HashMap<>();
        result.put("success", "true");

        // 输出定制结果
        feedbackCustomdata(result);
    }
}
